"""
股票数据分析系统 - 主入口程序
整合数据获取、技术指标计算和分析功能
支持命令行参数输入
"""

import argparse
import logging
import sys
import os
from datetime import datetime
from config import (
    OUTPUT_FILENAME_FORMAT,
    OUTPUT_ENCODING,
    SHOW_DATA_PREVIEW,
    PREVIEW_ROWS,
    LOG_LEVEL,
    LOG_FORMAT,
    apply_chinese_column_names
)
from data_fetcher import DataFetcher
from ta_calculator import TechnicalAnalyzer

# 配置日志
logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT)
logger = logging.getLogger(__name__)

def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(
        description='股票K线数据分析工具 - 获取K线数据并计算技术指标',
        formatter_class=argparse.RawTextHelpFormatter
    )
    
    # 添加参数说明
    parser.add_argument(
        'symbol', 
        type=str,
        help='股票/期货代码\n'
             '美股: AAPL, MSFT\n'
             'A股: 600000.SH, 000001.SZ\n'
             '港股: 0700.HK\n'
             '期货: RB9999 (螺纹钢主力), AU9999 (黄金主力)'
    )
    
    parser.add_argument(
        'period',
        choices=['60分钟', '日线', '周线', '月线'],
        help='K线周期\n'
             '60分钟 - 60分钟K线\n'
             '日线 - 日K线\n'
             '周线 - 周K线\n'
             '月线 - 月K线'
    )
    
    parser.add_argument(
        '-o', '--output', 
        default=None,
        help='输出文件名 (默认: 自动生成)'
    )
    
    parser.add_argument(
        '--no-indicators',
        action='store_true',
        help='不计算技术指标，仅获取原始数据'
    )
    
    parser.add_argument(
        '--no-cache',
        action='store_true',
        help='忽略缓存，强制从API获取最新数据'
    )
    
    parser.add_argument(
        '--debug',
        action='store_true',
        help='启用调试模式，显示详细日志'
    )
    
    args = parser.parse_args()
    
    # 调试模式设置
    if args.debug:
        logger.setLevel(logging.DEBUG)
        for handler in logger.handlers:
            handler.setLevel(logging.DEBUG)
        logger.debug("调试模式已启用")
    
    # 全局配置
    global ENABLE_CACHE
    ENABLE_CACHE = not args.no_cache
    
    logger.info("=" * 70)
    logger.info(f"开始处理: {args.symbol} [{args.period}]")
    logger.info("=" * 70)
    
    # 1. 获取数据
    logger.info("初始化数据获取器...")
    fetcher = DataFetcher()
    
    logger.info(f"获取 {args.symbol} 的 {args.period} K线数据...")
    df = fetcher.get_data(args.symbol, args.period)
    
    if df.empty:
        logger.error("未获取到有效数据，程序终止")
        sys.exit(1)
    
    logger.info(f"成功获取 {len(df)} 条K线数据")
    logger.info(f"时间范围: {df['timestamp'].min()} 至 {df['timestamp'].max()}")
    
    # 2. 计算技术指标
    if not args.no_indicators:
        logger.info("初始化技术指标计算器...")
        analyzer = TechnicalAnalyzer(period_name=args.period)

        logger.info("计算技术指标...")
        df = analyzer.calculate_indicators(df)
        
        if df.empty:
            logger.error("指标计算失败，程序终止")
            sys.exit(1)
        
        # 添加复合信号
        logger.info("添加复合交易信号...")
        df = analyzer.add_derived_signals(df)
        
        # 移除analysis_date列（如果存在）
        if 'analysis_date' in df.columns:
            df = df.drop('analysis_date', axis=1)
        
        logger.info(f"最终数据包含 {len(df.columns)} 列")
    
    # 3. 数据预览
    if SHOW_DATA_PREVIEW:
        logger.info("\n数据预览:")
        preview = df.tail(PREVIEW_ROWS)
        logger.info(f"\n{preview.to_string(index=False)}\n")
    
    # 4. 保存结果
    output_file = args.output or generate_output_filename(args.symbol, args.period)
    logger.info(f"生成的输出文件名: {output_file}")
    try:
        # 确保目录存在
        output_dir = os.path.dirname(output_file)
        if output_dir:  # 只有当目录不为空时才创建
            os.makedirs(output_dir, exist_ok=True)
        
        # 应用中文列名映射
        df_chinese = apply_chinese_column_names(df.copy())

        # 保存CSV文件（使用中文列名）
        df_chinese.to_csv(output_file, index=False, encoding=OUTPUT_ENCODING)
        logger.info(f"数据已保存至: {output_file}")
        logger.info(f"文件大小: {os.path.getsize(output_file)/1024:.2f} KB")
    except Exception as e:
        logger.error(f"保存文件失败: {e}")
        sys.exit(1)
    
    # 5. 生成DeepSeek分析指令
    analysis_instruction = generate_analysis_instruction(args.symbol, args.period)
    logger.info("\n" + "=" * 70)
    logger.info("DeepSeek 分析指令:\n")
    logger.info(analysis_instruction)
    logger.info("=" * 70)
    
    # 6. 保存分析指令到文件
    instruction_file = output_file.replace('.csv', '_analysis.txt')
    try:
        with open(instruction_file, 'w', encoding='utf-8') as f:
            f.write(analysis_instruction)
        logger.info(f"分析指令已保存至: {instruction_file}")
    except Exception as e:
        logger.error(f"保存分析指令失败: {e}")
    
    logger.info("程序执行完成")

def generate_output_filename(symbol, period):
    """
    生成输出文件名
    :param symbol: 股票代码
    :param period: K线周期
    :return: 输出文件名
    """
    # 清理股票代码中的特殊字符
    safe_symbol = symbol.replace(':', '_').replace('/', '_').replace('*', '_')
    
    # 使用当前日期
    current_date = datetime.now().strftime("%Y%m%d")
    
    # 使用配置的格式
    filename = OUTPUT_FILENAME_FORMAT.format(
        symbol=safe_symbol,
        period=period,
        date=current_date
    )
    
    return filename

def generate_analysis_instruction(symbol, period):
    """
    生成DeepSeek分析指令
    :param symbol: 股票代码
    :param period: K线周期
    :return: 分析指令文本
    """
    instruction = f"""
请分析以下股票/期货的K线数据：
- 标的: {symbol}
- 周期: {period}
- 数据文件已通过附件上传

### 分析要求：
1. **关键支撑位与阻力位分析**
   - 使用布林带（BOLL_UPPER, BOLL_MIDDLE, BOLL_LOWER）识别近期关键价位
   - 结合近期高点和低点（过去20根K线）确定重要支撑阻力位
   - 特别关注成交量密集区的价格水平

2. **多空信号分析**
   - 基于以下信号条件给出具体交易建议：
     - 多头信号 (LONG_SIGNAL=1)：当价格在20日均线上方、MACD金叉且RSI未超买时
     - 空头信号 (SHORT_SIGNAL=1)：当价格在20日均线下方、MACD死叉且RSI未超卖时
   - 评估最近5个交易信号的有效性

3. **趋势分析**
   - 使用趋势强度指标 (TREND_STRENGTH) 判断当前市场趋势
   - 结合多个时间框架分析（如果数据允许）：
     - 短期趋势（最近10根K线）
     - 中期趋势（最近50根K线）
     - 长期趋势（全部数据）

4. **形态识别**
   - 识别近期的K线形态（如头肩顶/底、双顶/底、三角形整理等）
   - 分析MACD和RSI的背离信号

5. **风险管理建议**
   - 基于波动率（布林带宽度BOLL_WIDTH）提出仓位管理建议
   - 给出合理的止损位设置建议
   - 评估当前市场的风险/回报比

6. **未来走势预测**
   - 预测未来5-10根K线的可能走势
   - 给出关键事件观察点（如重要经济数据发布、财报日期等）

### 输出格式要求：
- 使用中文撰写分析报告
- 包含数据统计摘要（时间范围、数据量、关键指标平均值）
- 结论部分明确给出交易建议（做多、做空或观望）
- 附上关键图表的数据点（如支撑阻力位具体数值）
"""

    return instruction.strip()

def print_welcome_banner():
    """打印欢迎横幅"""
    banner = r"""
   _____ _             _        ______        _   _             
  / ____| |           | |      |  ____|      | | (_)            
 | (___ | |_ __ _ _ __| |_ ___ | |__ __ _ ___| |_ _ _ __   __ _ 
  \___ \| __/ _` | '__| __/ _ \|  __/ _` / __| __| | '_ \ / _` |
  ____) | || (_| | |  | || (_) | | | (_| \__ \ |_| | | | | (_| |
 |_____/ \__\__,_|_|   \__\___/|_|  \__,_|___/\__|_|_| |_|\__, |
                                                           __/ |
                                                          |___/ 
    """
    print(banner)
    print("股票K线数据分析系统 v1.0")
    print("=" * 60)
    print("功能: 获取股票/期货K线数据，计算技术指标，生成分析报告")
    print("支持: 美股、A股、港股、期货主力合约")
    print("=" * 60)

if __name__ == "__main__":
    # 显示欢迎信息
    print_welcome_banner()
    
    # 检查是否直接双击运行
    if len(sys.argv) == 1:
        print("\n使用方法: python main.py <股票代码> <K线周期>")
        print("示例:")
        print("  python main.py AAPL 60分钟")
        print("  python main.py 600000.SH 日线")
        print("  python main.py 0700.HK 周线")
        print("  python main.py RB9999 月线")
        print("\n使用 --help 查看完整参数说明")
        sys.exit(0)
    
    # 运行主程序
    try:
        main()
    except KeyboardInterrupt:
        print("\n程序被用户中断")
        sys.exit(1)
    except Exception as e:
        logger.exception("程序运行出错")
        sys.exit(1)